home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
sxwork3.lzh
/
サンプル実用編
/
ペイント
/
GPFILE.C
< prev
next >
Wrap
Text File
|
1994-03-10
|
19KB
|
602 lines
/******************************************************************************
* gpfile.c: ファイル関係のモジュール
******************************************************************************
* Workroom SX-68K Sample Program Copyright 1994 SHARP
*/
#include <stdio.h>
#include <string.h>
#include <doslib.h>
#include <console.h> /* コンソール系マネージャを利用するときに必要 */
#include <event.h> /* イベントマンを利用するときに必要 */
#include <sxgraph.h> /* グラフ系マネージャを利用するときに必要 */
#include <window.h> /* ウィンドウマンを利用するときに必要 */
#include <control.h> /* コントロールマンを利用するときに必要 */
#include <dialog.h> /* ダイアログマンを利用するときに必要 */
#include <text.h> /* テキストマンを利用するときに必要 */
#include <task.h> /* タスクマンを利用するときに必要 */
#include "gpaint.h" /* このプログラム固有のヘッダファイル */
/******************************************************************************
* checkFileDlg(): ファイル名入力疑似ダイアログ内でのマウス左ダウン処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* LPoint lpos マウスが押された位置
*/
void checkFileDlg(ComVal *pcv, LPoint lpos)
{
int partCode; /* コントロールのパートコード */
int lastFC, lastBC, lastPM, lastFM;
Control **ctrlHdl; /* コントロールハンドル */
/* マウスのボタンが押されている間、コントロールの各種処理をシステムに
任せて、コントロールハンドルとボタンが押された、または離された場所
のパートコードを取得する */
partCode = SXCallCtrlM(pcv->windowPtr, &pcv->event, 0, 0, NULL, &ctrlHdl);
/* メインウィンドウをテキストタイプでカレントグラフにする */
setGraph(pcv->windowPtr, G_TXT);
/* フォントモードのセット */
lastFM = GMFontMode(G_PSET);
/* バックグラウンドカラーは白 */
lastBC = GMBackColor(G_LGRAY);
/* フォアグラウンドカラーを黒にする */
lastFC = GMForeColor(G_BLACK);
/* ペンモードをPSETに設定する */
lastPM = GMPenMode(G_PSET);
if (partCode == C_INBTTN) { /* 文字ボタンか? */
if (ctrlHdl == pcv->eSetBtnHdl)
/* [実行]ボタンだったなら */
execFileDlg(pcv, 1);
else if (ctrlHdl == pcv->eCanBtnHdl)
/* [取消]ボタンだったなら */
execFileDlg(pcv, 2);
/* コントロールでないとき */
} else if (GMPtInRect(&rcView, lpos)) {
/* アクセスページを0と1ページにする */
GMAPage(G_PAGE0 | G_PAGE1);
GMBackColor(G_WHITE);
TMEventW(pcv->fTEditHdl, &pcv->event);
}
/* メインウィンドウをカレントグラフにする */
GMSetGraph(&pcv->windowPtr->graph);
/* バック/フォアグラウンドカラーを元に戻す */
GMBackColor(lastBC);
GMForeColor(lastFC);
/* ペンモードを元に戻す */
GMPenMode(lastPM);
/* フォントモードを元に戻す */
GMPenMode(lastFM);
}
/******************************************************************************
* execFileDlg(): ファイル名入力疑似ダイアログ内での入出力処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* int num = 1: [実行]ボタン
* = 2: [取消]ボタン
*/
void execFileDlg(ComVal *pcv, int num)
{
int mode, num2;
FILE *hFile;
Rect rc;
char fWork[TS_NAMEMAX];
/* ファイル入出力モードを取得する */
mode = pcv->fileMode;
/* ルーペウィンドウが作成されているか? */
if (pcv->subwinPtr[LUPE] != NULL) {
/* 拡大レクタングルをグローバル座標系で求める */
rc = pcv->rcLupe;
GMSlideRect(&rc, GMLocalToGlobal(0));
} else
GMNullRect(&rc);
/* メインウィンドウをテキストタイプでカレントグラフにする */
setGraph(pcv->windowPtr, G_TXT);
GMForeColor(G_LGRAY);
GMBackColor(G_LGRAY);
num2 = 1;
if (num == 1) {
/* 入力文字列をワークにコピーする */
memcpy(fWork, *(*pcv->fTEditHdl)->text, 91);
fWork[(*pcv->fTEditHdl)->length] = 0;
/* ファイル名とドライブの状態をチェックする */
if (!checkDrive(fWork, mode, 1)) {
/* すべてのウィンドウのアップデートを行う */
allUpdate(pcv);
return;
}
if (mode == 1) {
hFile = fopen(fWork, "rb");
if (hFile != NULL) {
/* ファイルが存在する場合 */
fclose(hFile);
num2 = DMError(D_YESNO, "指定されたファイル名が存在します。\r"
"上書きしてもよろしいですか?");
}
} else if (mode == 2)
if (pcv->editFlag) /* 編集したか? */
num2 = DMError(D_EXEC, "現在までの編集結果を破棄します。");
}
if (num2 == 1) {
/* 疑似ダイアログを消去するならば */
/* カーソルを消去する */
TMCaret(pcv->fTEditHdl, 0);
clearEseDlg(pcv);
if (pcv->fTEditHdl != NULL) {
TMDispose(pcv->fTEditHdl); /* テキストを廃棄する */
pcv->fTEditHdl = NULL;
}
/* ファイル入出力モードをセット */
pcv->fileMode = -1;
if (num == 1) {
/* ファイル入出力の実行なら */
if (mode == 1)
saveFile(pcv, fWork);
else if (mode == 2)
loadFile(pcv, fWork);
}
/* すべてのウィンドウのアップデートを行う */
allUpdate(pcv);
/* ファイル入出力モードをクリア */
pcv->fileMode = 0;
}
}
/******************************************************************************
* loadFile(): 新規ファイルの読み込み処理
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* char *pname ファイル名へのポインタ
* 注釈: PIX 形式のファイルを読み込みます。
*/
void loadFile(ComVal *pcv, char *pname)
{
short work;
Rect rc;
Graph fgraph;
Bits **fBitsHdl;
FILE *hFile;
LASCII wtitle;
char str[256];
/* ファイルをオープンする */
hFile = fopen(pname, "rb");
if (hFile == NULL) {
sprintf(str, "ファイル: (%s)\rがオープンできません。\0", pname);
DMError(D_CONFIRM, str);
return;
}
/* オフスクリーン用グラフとファイル読み込み用ワークグラフをクリアする */
memset(&pcv->offGraph, 0, sizeof(Graph));
memset(&fgraph, 0, sizeof(Graph));
/* 前の絵のレクタングルをセーブする */
rc = pcv->pictSize;
/* ファイルを読み込む */
if (!readFile(pcv, hFile, &fBitsHdl)) {
if (fBitsHdl != NULL)
/* ワーク用のビッツハンドルを廃棄する */
GMDisposeBits(fBitsHdl);
fclose(hFile);
return;
}
fclose(hFile);
/* ファイル読み込み用ワークグラフ情報を作成する */
fgraph.bmap = &(*fBitsHdl)->bmap;
if (GMCalcGraph(&fgraph) != 0) {
DMError(D_CONFIRM, "読み込みのためのワークが作成できません。");
return;
}
/* オフスクリーン用グラフ情報を作成する */
pcv->offGraph.bmap = &(*pcv->offBitsHdl[pcv->offIdx])->bmap;
if (GMCalcGraph(&pcv->offGraph) != 0) {
DMError(D_CONFIRM, "読み込みのためのワークが作成できません。");
return;
}
/* オフスクリーン用グラフをカレントグラフにする */
GMSetGraph(&pcv->offGraph);
/* ビッツをロックする */
GMLockBits(fBitsHdl);
GMLockBits(pcv->offBitsHdl[pcv->offIdx]);
/* ビットマップをセットする */
fgraph.bmap = &(*fBitsHdl)->bmap;
pcv->offGraph.bmap = &(*pcv->offBitsHdl[pcv->offIdx])->bmap;
/* ファイルグラフからオフスクリーン用グラフに転送する */
GMTransImg(&(*fBitsHdl)->bmap, &(*pcv->offBitsHdl[pcv->offIdx])->bmap, &pcv->pictSize, &pcv->pictSize);
/* ビッツをUnlockする */
GMUnlockBits(fBitsHdl);
if (pcv->undoFlag) { /* UNDOが現在ONなら */
/* 現在使用中のビッツハンドルではないほうのインデックスを取得する */
work = (pcv->offIdx | 0xfffe) ^ 0xffff;
/* UNDO用のビッツハンドルを廃棄する */
GMDisposeBits(pcv->offBitsHdl[work]);
/* 新しいUNDO用のビッツハンドルを確保する */
pcv->offBitsHdl[work] = GMNewBits(G_GR2, &pcv->pictSize, 0);
if (pcv->offBitsHdl[work] == NULL) {
DMError(D_CONFIRM, "UNDOのためのメモリが確保できません。");
pcv->offBitsHdl[work] = NULL;
changeUndo(pcv);
} else {
/* ビッツをロックする */
GMLockBits(pcv->offBitsHdl[work]);
/* UNDO用のバッファにもコピーする */
GMCopy(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, &(*pcv->offBitsHdl[work])->bmap, &pcv->pictSize, &pcv->pictSize, G_PSET, NULL);
/* ビッツをUnlockする */
GMUnlockBits(pcv->offBitsHdl[work]);
}
}
/* ビッツをUnlockする */
GMUnlockBits(pcv->offBitsHdl[pcv->offIdx]);
/* ワーク用のビッツハンドルを廃棄する */
GMDisposeBits(fBitsHdl);
/* ファイルグラフのビットマップポインタだけヌルにして*/
fgraph.bmap = NULL;
/* ファイルグラフをクローズする */
GMCloseGraph(&fgraph);
/* ファイル名をタイトルに設定する */
strcpy(pcv->fileName, pname);
/* タイトルにコピーする */
wtitle[0] = sprintf((char *) &wtitle[1], "%s %s", WINTITLE, pcv->fileName);
/* ウィンドウサイズの変更を行う*/
changeWinSize(pcv, &rc);
/* タイトルの設定(ファイル名の更新) */
WMTitleSet(pcv->windowPtr, wtitle);
/* ウィンドウサイズの更新 */
WMSize(pcv->windowPtr, pcv->nowWinSize.l.r_b, 0);
/* パレットの設定をする */
setPalet(pcv->oldPaletBuf);
/* 絵の全体のレクタングルの部分をオフスクリーンからコピーする */
addUpdate(pcv->windowPtr, NULL);
/* ルーペウィンドウが表示されていたら */
#ifdef dummy
if (pcv->activeFlag && pcv->subwinPtr[LUPE])
/* ルーペウィンドウの内部を描く */
drawLupeRect(pcv);
#endif
pcv->editFlag = FALSE; /* 編集フラグをクリアする */
}
/******************************************************************************
* readFile(): ファイルを読み込みバッファにセットする
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* FILE *hFile ファイルハンドルへのポインタ
* Bits ***fBitsHdl ファイル読み込み用ビッツハンドルを格納するポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
*/
BOOLEAN readFile(ComVal *pcv, FILE *hFile, Bits ***fBitsHdl)
{
int i, len;
TX16 wBuff;
*fBitsHdl = NULL;
len = fread((unsigned char *) &wBuff, sizeof(char), 48, hFile);
if (len != 48) {
DMError(D_CONFIRM, "ファイルの読み込みに失敗しました。");
return FALSE;
}
if (wBuff.self != 'TX16') { /* 'TX16'? */
DMError(D_CONFIRM, "ファイル形式が違います。\r"
"ファイルの読み込みを中止します。");
return FALSE;
}
/* ウィンドウのレクタングルを設定 */
pcv->nowWinSize = wBuff.bounds;
pcv->pictSize = wBuff.bounds;
if (pcv->nowWinSize.d.right < 340)
pcv->nowWinSize.d.right = 340;
if (pcv->nowWinSize.d.bottom < 120)
pcv->nowWinSize.d.bottom = 120;
/* パレットの設定 */
for (i = 0; i < 16; i++) {
pcv->oldPaletBuf[i] = wBuff.palet[i];
pcv->paletBuf[i] = wBuff.palet[i];
}
if (pcv->offBitsHdl[pcv->offIdx] != NULL)
/* オフスクリーン用ビッツハンドルを廃棄する */
GMDisposeBits(pcv->offBitsHdl[pcv->offIdx]);
/* オフスクリーン用ビッツハンドルを確保する(GR2モードにする)*/
pcv->offBitsHdl[pcv->offIdx] = GMNewBits(G_GR2, &pcv->pictSize, 0);
if (pcv->offBitsHdl[pcv->offIdx] == NULL) {
DMError(D_CONFIRM, "メモリが確保できません。");
return FALSE;
}
/* ファイル読み込み用ビッツハンドルを確保する(TXTモードにする)*/
*fBitsHdl = GMNewBits(G_TXT, &pcv->pictSize, G_ALLPAGE);
if (*fBitsHdl == NULL) {
DMError(D_CONFIRM, "メモリが確保できません。");
return FALSE;
}
/* ビッツ領域にイメージデータを読み込む */
len = fread((**fBitsHdl)->data, sizeof(char), (size_t)(**fBitsHdl)->size, hFile);
if (len != (**fBitsHdl)->size) {
DMError(D_CONFIRM, "ファイルの読み込みに失敗しました。");
return FALSE;
}
return TRUE;
}
/******************************************************************************
* saveFile(): バッファからファイルに書き出す
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* char *pname ファイル名へのポインタ
* 戻り値: int < 0: 書き込み失敗
* >= 0: 書き込み成功
* 注釈: PIX形式でファイルに書き出す。
*/
void saveFile(ComVal *pcv, char *pname)
{
int i, len, errCode;
FILE *hFile;
Graph fgraph;
Bits **fBitsHdl;
TX16 wBuff;
LASCII wtitle;
char str[256];
hFile = fopen(pname, "wb");
if (hFile == NULL) {
sprintf(str, "ファイルがオープンできません。\r(%s)\0", pname);
DMError(D_CONFIRM, str);
return;
}
/* 待ち状態を示すマウスポインタを表示する */
EMEnCross();
/* ファイル書き込み用ビッツハンドルを確保する(TXTモードにする)*/
fBitsHdl = NULL;
fBitsHdl = GMNewBits(G_TXT, &pcv->pictSize, G_ALLPAGE);
if (fBitsHdl == NULL) {
/* ファイルをクローズする */
fclose(hFile);
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
DMError(D_CONFIRM, "メモリが確保できません。");
return;
}
/* ファイル書き込み用ワークのグラフをヌルクリアする */
memset(&fgraph, 0, sizeof(Graph));
/* ファイル書き込み用ワークグラフ情報を作成する */
fgraph.bmap = &(*fBitsHdl)->bmap;
errCode = GMCalcGraph(&fgraph);
if (errCode < 0) {
/* ファイルをクローズする */
fclose(hFile);
/* ワーク用のビッツハンドルを廃棄する */
GMDisposeBits(fBitsHdl);
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
DMError(D_CONFIRM, "グラフが作成できません。");
return;
}
/*ファイルグラフをカレントグラフにする */
GMSetGraph(&fgraph);
/* ビッツをロックする */
GMLockBits(fBitsHdl);
GMLockBits(pcv->offBitsHdl[pcv->offIdx]);
/* ビットマップをセットする */
fgraph.bmap = &(*fBitsHdl)->bmap;
pcv->offGraph.bmap = &(*pcv->offBitsHdl[pcv->offIdx])->bmap;
/* オフスクリーン用グラフからファイルグラフに転送する */
GMTransImg(&(*pcv->offBitsHdl[pcv->offIdx])->bmap, &(*fBitsHdl)->bmap, &pcv->pictSize, &pcv->pictSize);
wBuff.self = 'TX16'; /* 'TX16'をセット */
wBuff.size = (*fBitsHdl)->size + 40;
/* ウィンドウのレクタングルを設定 */
wBuff.bounds = pcv->pictSize;
/* パレットの設定 */
for (i = 0; i < 16; i++)
wBuff.palet[i] = pcv->oldPaletBuf[i];
/* ヘッダ部をファイルに書き込む */
len = fwrite((unsigned char *) &wBuff, sizeof(char), 48, hFile);
if (len != 48) {
/* 待ち状態を示すマウスポインタを元に戻す */
fclose(hFile);
EMDeCross();
DMError(D_CONFIRM, "ファイルの書き込みに失敗しました。");
return;
}
/* データ部をファイルに書き込む */
len = fwrite((*fBitsHdl)->data, sizeof(char), (size_t)(*fBitsHdl)->size, hFile);
if (len != (*fBitsHdl)->size) {
/* 待ち状態を示すマウスポインタを元に戻す */
fclose(hFile);
EMDeCross();
DMError(D_CONFIRM, "ファイルの書き込みに失敗しました。");
}
/* ファイルをクローズする */
fclose(hFile);
/* ビッツをUnlockする */
GMUnlockBits(pcv->offBitsHdl[pcv->offIdx]);
GMUnlockBits(fBitsHdl);
/* ワーク用のビッツハンドルを廃棄する */
GMDisposeBits(fBitsHdl);
/* ファイルグラフのビットマップポインタだけヌルにして*/
fgraph.bmap = NULL;
/* ファイルグラフをクローズする */
GMCloseGraph(&fgraph);
/* ファイル名をタイトルに設定する */
strcpy(pcv->fileName, pname);
/* タイトルにコピーする */
wtitle[0] = sprintf((char *) &wtitle[1], "%s %s", WINTITLE, pcv->fileName);
/* タイトルの設定(ファイル名の更新) */
WMTitleSet(pcv->windowPtr, wtitle);
pcv->editFlag = FALSE; /* 編集フラグをクリアする */
/* 待ち状態を示すマウスポインタを元に戻す */
EMDeCross();
}
/******************************************************************************
* loadResource(): リソースファイルの読み込み
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
* 注釈: すべてのリソースを読み込み、配列に登録する
*/
BOOLEAN loadResource(ComVal *pcv)
{
int i, errCode;
BOOLEAN stat;
Task task; /* タスク管理レコード */
char drv[2], path[65], node[19], ext[5];
char szFile[TS_NAMEMAX]; /* フルパスでファイル名が戻るバッファ */
TSGetTdb(&task, TS_OWN); /* タスク管理レコードを取得する */
strsfn(task.name, drv, path, node, ext); /* タスク名を分解する */
strmfn(szFile, drv, path, "", ""); /* 検索パスを作成する */
/* リソースファイルを検索する */
errCode = TSSearchFile("ペイント.lb", szFile, szFile);
if (errCode < 0) {
pcv->errorCode = 11; /* 見付からなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
/* リソースのオープン、リソースマップを獲得する */
pcv->resMap = TSResOpen(szFile);
if (pcv->resMap == NULL) {
pcv->errorCode = 12; /* オープンできなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
/* すべてのリソースを読み込む(ファイルはクローズされる)*/
errCode = TSResLoad();
if (errCode < 0) {
pcv->errorCode = 13; /* 読み込めなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
/* ハンドルの配列をクリアする */
for (i = 0; i < 21; i++)
pcv->tlBtnImg[i] = NULL;
for (i = 0; i < 8; i++)
pcv->penImg[i] = NULL;
for (i = 0; i < 12; i++)
pcv->tileImg[i] = NULL;
pcv->eraserImg = NULL;
pcv->plBtnImg[0] = NULL;
pcv->plBtnImg[1] = NULL;
/* リソースデータの取得 */
stat = getResIdn('PAT2', 128, 1, (_Handle *) &pcv->eraserImg)
&& getResIdn('PAT2', 200, 8, (_Handle *) pcv->penImg)
&& getResIdn('PAT2', 300, 12, (_Handle *) pcv->tileImg)
&& getResIdn('PAT3', 128, 21, (_Handle *) pcv->tlBtnImg)
&& getResIdn('PAT4', 128, 3, (_Handle *) pcv->plBtnImg)
&& getResIdn('MCSR', 128, 1, (_Handle *) &pcv->mousePtn);
if (!stat) {
pcv->errorCode = 14; /* 取得できなかった */
return FALSE; /* 失敗したのでFALSEを返す */
}
return TRUE; /* 成功したのでTRUEを返す */
}
/******************************************************************************
* getResIdn(): 連続したリソースデータの読み込み
******************************************************************************
* 引数: ComVal *pcv 共通変数へのポインタ
* 戻り値: BOOLEAN = TRUE: 読み込み成功
* = FALSE: 読み込み失敗
* 注釈: すべてのリソースを読み込み、配列に登録する
*/
BOOLEAN getResIdn(int type, int id, int max, _Handle *rsc)
{
int i;
/* リソースデータの取得 */
for (i = 0; i < max; i++) {
rsc[i] = TSRscGet(type, id + i);
if (rsc[i] == NULL)
return FALSE;
}
return TRUE;
}
/******************************************************************************
* checkDrive(): 指定されたパス名よりドライブとファイル名をチェックする
******************************************************************************
* 引数: char *pname ファイル名へのポインタ
* int imode = 1: 書き込みのための検査
* = 2: 読み込みのための検査
* int dmode = 0: エラーダイアログを出さない
* = 1: エラーダイアログを出す
* 戻り値: BOOLEAN = TRUE: ドライブ・ファイルのアクセスが可能
* = FALSE: ドライブ・ファイルのアクセスが不可
* 注釈: *pnameには、フルパス名が作成されます。
*/
BOOLEAN checkDrive(char *pname, int imode, int dmode)
{
int stat;
struct NAMECKBUF nbuf;
/* 指定ファイル名よりドライブ、パス名を取得する */
stat = NAMECK((unsigned char *) pname, &nbuf);
if (stat < 0) {
if (dmode == 1)
DMError(D_CONFIRM, "ファイル名が正しくありません。");
return FALSE;
}
/* ドライブの状態を調べる */
/* 指定ファイル名のドライブの状態を取得する */
stat = TSDrvctrl(0, nbuf.drive[0] & 0x0f);
/* ドライブが準備されているかをチェックする */
if ((stat & 0x06) != 0x02) {
DMError(D_CONFIRM, "ドライブの準備ができていません。");
return FALSE;
}
/* プロテクトされているかどうかをチェックする */
if (dmode == 1 && (stat & 0x0a) == 0x0a) {
DMError(D_CONFIRM, "ライトプロテクトされています。\r"
"書き込みを行うことができません。");
return FALSE;
}
/* フルパスのファイル名を作成する */
strcpy(pname, (char *) nbuf.drive);
strcat(pname, (char *) nbuf.name);
strcat(pname, (char *) nbuf.ext);
return TRUE;
}